﻿/**
 * 模型相关的元数据。
 */
Ext.define('Happy.metadata.mixin.MetadataOfModel', {
    /**
     * 返回模型的类名。
     * 
     * @return {String}
     */
    getModelClassName: function () {
        var me = this;

        return me.data.namespace + '.' + me.data.name.toLowerCase() + '.model.Model';
    },

    /**
     * 返回树形模型的类名。
     * 
     * @return {String}
     */
    getTreeModelClassName: function () {
        var me = this;

        return me.data.namespace + '.' + me.data.name.toLowerCase() + '.model.TreeModel';
    },

    /**
     * 返回默认的模型的字段数组。
     * 
     * @return {Array}
     */
    getDefaultModelFields: function () {
        var me = this;

        return Ext.Array.map(me.getProperties(), function (property) {
            var fieldConfig = window.CSharpTypeMapper.getModelFieldDefaultConfig(property.dataType);

            fieldConfig = Ext.apply({
                name: property.name
            }, property.fieldConfig || {}, fieldConfig);

            if (property.fieldConfigFns) {
                Ext.Array.each(property.fieldConfigFns, function (fieldConfigFn) {
                    fieldConfigFn(me, property, fieldConfig);
                });
            }

            return fieldConfig;
        });
    },

    /**
     * 返回默认的树形模型的字段数组。
     * 
     * @return {Array}
     */
    getDefaultTreeModelFields: function () {
        var me = this;

        return me.getDefaultModelFields().concat([
            {
                name: 'parentId',
                type: 'string',
                defaultValue: null,
                useNull: false,
                persist: false
            },
            {
                name: 'leaf',
                type: 'bool',
                defaultValue: false,
                persist: false
            }
        ]);
    },

    /**
     * 返回默认的代理配置。
     * 
     * @return {Object}
     */
    getDefaultProxyConfig: function () {
        var me = this;

        var proxyConfig = {
            type: 'happy-ajax',
            api: {
                create: '/' + me.data.urlPrefix + '/' + me.data.name + '/Create',
                update: '/' + me.data.urlPrefix + '/' + me.data.name + '/Update',
                destroy: '/' + me.data.urlPrefix + '/' + me.data.name + '/Delete',
                read: '/' + me.data.urlPrefix + '/' + me.data.name + '/Page',
                load: '/' + me.data.urlPrefix + '/' + me.data.name + '/Load',
                fetch: '/' + me.data.urlPrefix + '/' + me.data.name + '/Fetch'
            }
        };

        return Ext.merge(proxyConfig, me.data.proxy || {});
    },

    /**
     * 返回默认的树模型代理配置。
     * 
     * @return {Object}
     */
    getDefaultTreeProxyConfig: function () {
        var me = this;

        var proxyConfig = {
            type: 'happy-ajax',
            api: {
                create: '/' + me.data.urlPrefix + '/' + me.data.name + '/Create',
                update: '/' + me.data.urlPrefix + '/' + me.data.name + '/Update',
                destroy: '/' + me.data.urlPrefix + '/' + me.data.name + '/Delete',
                read: '/' + me.data.urlPrefix + '/' + me.data.name + '/Children',
                load: '/' + me.data.urlPrefix + '/' + me.data.name + '/Load',
                fetch: '/' + me.data.urlPrefix + '/' + me.data.name + '/Fetch'
            }
        };

        return Ext.merge(proxyConfig, me.data.treeProxy || {});
    },

    /**
     * 返回默认的模型 relation 配置。
     * 
     * @return {Object}
     */
    getDefaultModelRelationConfig: function () {
        var me = this;

        if (!me.data.relation) {
            return {};
        }

        return {
            hasMany: me.getDefaultModelOneToManyRelationConfig()
        };
    },

    /**
     * 返回默认的模型 !：N relation 配置。
     * 
     * @return {Object}
     */
    getDefaultModelOneToManyRelationConfig: function () {
        var me = this;

        if (!me.data.relation.hasMany) {
            return {};
        }

        return Ext.Array.map(me.data.relation.hasMany, function (item) {
            return {
                name: item.metadata.data.plural,
                store: item.metadata.getStoreClassName(),
                isNested: item.metadata.isLifeCycleDependent(),
                foreignKey: item.foreignKey,
                foreignKeyDataType: item.metadata.data.properties[item.foreignKey].dataType
            };
        });
    }
});